#include <iostream>
#include "../resources/Animal_virtual_baseVers.h"

using namespace std;

void print(const Bear& b)
{
    b.print(cout);
}

// 如果存在该重载，则 print(ying_yang) 将产生调用二义性错误
// void print(const Endangered& e)
// {
//     e.print(cout);
// }

void highlight(const Endangered& e)
{
    e.highlight();
}

ostream& operator<<(std::ostream& os, const ZooAnimal& z)
{
    os << z.name();
    return os;
}

int main()
{
    Panda ying_yang("ying_yang");
    print(ying_yang);               // 把一个 Panda 对象传递给 Bear&
    highlight(ying_yang);           // 把一个 Panda 对象传递给 Endangered&
    cout << ying_yang << endl;      // 把一个 Panda 对象传递给 ZooAnimal&

    cout << "*********" << endl;

    Bear *pb = new Panda("ying_yang");
    pb->print(cout);                // 正确：Panda::print()
    // pb->cuddle();                // 错误：不属于 Bear 的接口
    // pb->highlight();             // 错误：不属于 Bear 的接口
    delete pb;                      // 正确：Panda::~Panda()

    cout << "*********" << endl;

    Endangered *pe = new Panda("ying_yang");
    pe->print(cout);                // 正确：Panda::print()
    // pe->toes();                  // 错误：不属于 Endangered 的接口
    // pe->cuddle();                // 错误：不属于 Endangered 的接口
    pe->highlight();                // 正确：Panda::highlight()
    delete pe;                      // 正确：Panda::~Panda()
}